import 'package:flutter/material.dart';
import 'package:t_flutter_test/component/layout_widget.dart';

class File01 extends StatefulWidget {
  const File01({super.key});

  // 1. 创建组件时调用
  @override
  // ignore: no_logic_in_create_state
  File01State createState() {
    debugPrint('父组件 createState');
    return File01State();
  }
}

class File01State extends State<File01> {
  int count = 1;

  // 2. 组件被初始化时调用
  // 一般用于: 对组件变量赋值, 请求网络数据, 更新状态
  @override
  void initState() {
    debugPrint('父组件 initState');
    super.initState();
  }

  // 3. 状态组件的依赖项发生变化时调用
  // 只会被执行1次
  @override
  void didChangeDependencies() {
    debugPrint('父组件 didChangeDependencies');
    super.didChangeDependencies();
  }

  // didUpdateWidget：该方法主要是组件重新构建时才会被调用的
  // 比如：热重载 或者 父组件发生 build 时子组件的该方法就会被调用
  // 注意：该方法被调用后，本组件中的 build 方法一定也会再被调用
  @override
  void didUpdateWidget(covariant File01 oldWidget) {
    debugPrint('父组件 didUpdateWidget');
    super.didUpdateWidget(oldWidget);
  }

  // 5. 组件即将销毁时自动调用的
  @override
  void deactivate() {
    debugPrint('父组件 deactivate');
    super.deactivate();
  }

  // 6. 组件销毁时自动调用的
  @override
  void dispose() {
    debugPrint('父组件 dispose');
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    debugPrint('父组件 build');
    return LayoutWidget(
      body:
          count % 5 != 0
              ? File01Count(count: count)
              : File01Info(name: '张三', age: 25),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          setState(() {
            count++;
          });
        },
      ),
    );
  }
}

class File01Info extends StatelessWidget {
  const File01Info({super.key, required this.name, required this.age});

  final String name;
  final int age;

  @override
  Widget build(BuildContext context) {
    return Center(child: Text('$name, 今年 $age 岁'));
  }
}

class File01Count extends StatefulWidget {
  const File01Count({super.key, required this.count});
  final int count;

  // 1. 创建组件时调用
  @override
  // ignore: no_logic_in_create_state
  File01CountState createState() {
    debugPrint('子组件 createState');
    return File01CountState();
  }
}

class File01CountState extends State<File01Count> {
  int age = 0;

  // 2. 组件被初始化时调用
  // 一般用于: 对组件变量赋值, 请求网络数据, 更新状态
  @override
  void initState() {
    debugPrint('子组件 initState');
    super.initState();
  }

  // 3. 状态组件的依赖项发生变化时调用
  // 只会被执行1次
  @override
  void didChangeDependencies() {
    debugPrint('子组件 didChangeDependencies');
    super.didChangeDependencies();
  }

  // didUpdateWidget：该方法主要是组件重新构建时才会被调用的
  // 比如：热重载 或者 父组件发生 build 时子组件的该方法就会被调用
  // 注意：该方法被调用后，本组件中的 build 方法一定也会再被调用
  @override
  void didUpdateWidget(covariant File01Count oldWidget) {
    debugPrint('子组件 didUpdateWidget');
    super.didUpdateWidget(oldWidget);
  }

  // 5. 组件即将销毁时自动调用的
  @override
  void deactivate() {
    debugPrint('子组件 deactivate');
    super.deactivate();
  }

  // 6. 组件销毁时自动调用的
  @override
  void dispose() {
    debugPrint('子组件 dispose');
    super.dispose();
  }

  // 4. 组件状态更新时自动调用
  // 会调用多次
  @override
  Widget build(BuildContext context) {
    debugPrint('子组件 build');

    return Center(
      child: TextButton(
        onPressed: () {
          setState(() {
            age++;
          });
        },
        child: Text('计数器: ${widget.count}, 岁数: $age'),
      ),
    );
  }
}
